<?php
require_once("lib/class.phpmailer.php");

class UsuarioBSN extends GenericBSN {

	function __construct() {
		$this->dao = new UsuarioDAO();		
	}

	public function consultar($vars) {
		try {
			$this->preencher($vars);
			$this->Records = $this->dao->consultar($this->sql, $this->params);
			$this->Result  = "OK";
			$this->TotalRecordCount = $this->dao->contarRegistros($this->where, $this->params);   
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao consultar: " . $e->getMessage();
		}
	}
	
	public function consultarGrupos($vars) {
		try {
			$usuario = $vars['usuario'];
			
			$grpCtxDao = new Grp_x_ContextoDAO();
			$ctx = $grpCtxDao->consultarUsuarioLogado(1);
			$dao = new Usu_x_GrupoDAO();
		    $dao->limitarContexto(!$ctx[0]['acessoConsulta']);
		    
			$this->Records = $dao->consultarGrupos($usuario);
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	public function consultarGruposDisponiveis($vars) {
		try {
			$grpCtxDao = new Grp_x_ContextoDAO();
			$ctx = $grpCtxDao->consultarUsuarioLogado(1);
		    $dao = new Usu_x_GrupoDAO();
		    $dao->limitarContexto(!$ctx[0]['acessoConsulta']);
		    
		    $this->Records = $dao->consultarGruposDisponiveis($vars['usuarioid'], $vars['grupo']);
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}

	public function inserir($vars) {
		try {
			$registro['usuario'] = $vars['usuario'];
			$registro['senha']   = $vars['senha'];
			$registro['mail']	 = $vars['mail'];
			$this->Record = $this->dao->inserir($registro);
			$this->dao->replicarConfig($_SESSION['usuario']['id'], $this->Record['id']);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar inserir: " . $e->getMessage();
		}
	}
	
	public function alterar($registro) {
		try {
			$this->dao->alterar($registro);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar alterar: " . $e->getMessage();
		}
	}
	
	public function excluir($registro) {
		try {
			$dao = new Usu_x_GrupoDAO();
			// todo: verificar contexto de usu_x_grupo
			$res = $dao->excluirUsuario($registro['id'], false);
			$res = $this->dao->excluir($registro['id']);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar excluir: " . $e->getMessage();
		}
	}

	public function login($vars) {
		try {
			$usu = $this->dao->login($vars['edtUsuario'], $vars['edtSenha']);

			if (!$usu) {
				throw new Exception("Usuário e senha inválidos!");
			}
			
			$_SESSION["usuario"] = $usu[0];
			$login["login"] 	 = $usu[0];
			$login["menu"] 		 = $this->getMenu();
			$login["config"] 	 = $this->setarConfig();

			$this->Message = "Bem-vindo, " . $usu[0]['usuario'] . ".";
			if ($usu[0]["senha_temp"]) {
				$this->dao->excluirSenhaTemp($usu[0]['id']);
				$this->Message .= "<br /><br /><b>Atenção: </b> O login foi efetivado com o uso da senha temporária, por favor, altere sua senha na Página do Usuário.<br />";
			}
			
			$this->definirObra($_SESSION["config"]["obra_padrao"]);
			
			$this->Result  = "OK";
			$this->Records = $login;
		} catch (Exception $e) {
			$this->logout();
			$this->Result  = "ERROR";
			$this->Message = $e->getMessage();
		}
	}
	
	public function definirObra($vars) {
		try {
			if (!isset($vars['nome'])) {
				$dao = new ObraDAO();
				$obra = $dao->consultarPK($vars['id']);
				$vars = $obra ? $obra[0] : null;
			}
			$_SESSION["config"]["obra"]	 = $vars;
			$this->Result = "OK";
			$this->Records = $vars;
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	public function consultarObra() {
		try {
			$this->Records = $_SESSION["config"]["obra"];
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	private function setarConfig() {
		$cfg = $this->dao->consultarConfig($_SESSION['usuario']['id']);
		foreach($cfg as $key => $param) {
			switch ($param['parametro']) {
				case 'obra_padrao':
					$dao = new ObraDAO();
					$obra = $dao->consultarPK($param['valor']);
					$res['obra_padrao'] = $obra ? $obra[0] : null;
					break;
			}
		}
		$_SESSION["config"] = $res;
		return $res;
	}
	
	public function consultarConfig() {
		try {
			if (!isset($_SESSION["config"])) {
				$_SESSION["config"] = $this->dao->consultarConfig($_SESSION['usuario']['id']);
			}
			$this->Records = $_SESSION["config"];
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	public function alterarConfig($vars) {
		try {
			$registro['usuario'] = $_SESSION['usuario']['id'];
			$registro['parametro'] = $vars['parametro'];
			$registro['valor'] = $vars['valor'];
			$this->dao->alterarConfig($registro);
			$this->setarConfig();
			$this->Result = 'OK';
			$this->Message = 'Configuração alterada com sucesso!';
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	public function alterarSenha($vars) {
		try {
			if (!$_SESSION['usuario']['senha_temp']) {
				$usu = $this->dao->Login($_SESSION['usuario']['usuario'], $vars['senhaatual']);
				if (!$usu) {
					throw new Exception("Senha atual inválida!");
				}
			}
			
			$usuario['id'] = $_SESSION['usuario']['id'];
			$usuario['senha'] = $vars['novasenha']; 
			$this->dao->alterar($usuario);
			
			$this->Message = "Senha alterada com sucesso!";
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	private function getMenu() {
		$dao = new RecursoDAO();
		return $dao->consultarArvore("mnSistema");
	}
	
	public function logout() {
		try {
			session_destroy();
			unset($_SESSION);
			$this->clear();
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	public function redefinirSenha($vars) {
		try {
			for ($i = 0, $token = ""; $i++ < 10;) {
				$token .= chr(mt_rand(33, 126));
			}
			
			$usuario = $this->dao->inserirSenhaTemp($vars['edtUsuario'], $token);
			
			if ($usuario) {
				$assunto = utf8_decode("Compras-Net 2.0 - Redefinição de senha");
	
				$corpo  = "Nas próximas 24 horas você poderá efetuar o login no sistema com a seguinte senha: $token\n\n";
				$corpo .= "O sistema informará sobre a necessidade de alteração da senha assim que o login for feito utilizando essa senha temporária.\n\n";
				$corpo .= "A senha antiga continua válida até que a alteração de senha seja confirmada, portanto, se não foi você quem solicitou essa redefinição de senha, basta ignorá-la.\n\n";
				$corpo .= "Essa é uma mensagem automática e não deve ser respondida.";
	
				$this->enviarEmail($usuario['mail'], $assunto, $corpo);
				$this->Result = "OK";
				$this->Message = "Mensagem com instruções enviada para o e-mail cadastrado.";
			} else {
				$this->Result = "ERROR";
				$this->Message = "Endereço eletrônico do usuário não encontrado!";
			}
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	private function enviarEmail($para, $assunto, $corpo) {
		$de = 'mtd@engenharia.com.br';
		$de_nome = 'MTD - Compras-Net 2.0';
		
		$mail = new PHPMailer();
		$mail->IsSMTP();
		$mail->SMTPDebug = 0;
		$mail->SMTPAuth = true;
		$mail->SMTPSecure = 'ssl';
		$mail->Host = 'smtp.gmail.com';
		$mail->Port = 465;
		$mail->Username = '';
		$mail->Password = '';
		$mail->SetFrom($de, $de_nome);
		$mail->Subject = $assunto;
		$mail->Body = $corpo;
		$mail->AddAddress($para);

		if(!$mail->Send()) {
			throw new Excpetion("Erro ao enviar e-mail: $assunto <br />" . $mail->ErrorInfo);
		}
	}
	
	public function inserirGrupo($vars, $finalizarTransacao = true) {
		try {
			$dao = new GrupoUsuariosDAO();
			$grp = is_numeric($vars['grupo']) ? $dao->consultarPK($vars['grupo']) : $dao->consultarGrupo($vars['grupo']);
			
			if (!isset($grp[0]['id'])) {
				throw new Exception("Perfil <b>" . $vars['grupo'] . "</b> não encontrado!");
			}
			
			$reg['grupo'] = $grp[0]['id'];
			$res['grupo'] = $grp[0]['grupo'];
			$reg['usuario'] = $vars['usuario'];
			$res['pk'] =  $vars['usuario'] . "," . $reg['grupo'];

			$grpCtxDao = new Grp_x_ContextoDAO();
			$ctx = $grpCtxDao->consultarUsuarioLogado(1);
			$dao = new Usu_x_GrupoDAO();
		    $dao->limitarContexto(!$ctx[0]['acessoAlteracao']);
		    
		    $grps = $dao->consultarGruposDisponiveis($reg['usuario'], $reg['grupo']);
		    if (!$grps) {
		    	throw new Exception("Perfil <b>" . $res['grupo'] . "</b> não encontrado ou indisponível para o usuário."); 
		    }
			
		    $dao->inserir($reg, $finalizarTransacao);
			$reg['pk']		= $vars['usuario'] . "," . $vars['grupo'];

			$this->Record  = $res;
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = $e->getMessage();
		}
	}
	
	public function excluirGrupo($vars) {
		try {
			$dao = new Usu_x_GrupoDAO();
			$pk = explode(",", $vars["pk"]);
			$reg['usuario'] = $pk[0];
			$reg['grupo'] = $pk[1];
	
			// contexto
			$grpCtxDao = new Grp_x_ContextoDAO();
			$ctx = $grpCtxDao->consultarUsuarioLogado(1);
			$grpUsuDao = new GrupoUsuariosDAO();
			if (!$ctx[0]['acessoAlteracao']) {
				if (!$grpUsuDao->estaNoContexto($reg['grupo'])) {
					throw new Exception("Tentativa de excluir um usuário de um perfil fora do contexto permitido.");
				}
			}
			// fim contexto
				
			$dao->excluir($reg);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = $e->getMessage();
		}
	}
}
?>